package utils

import (
	"fmt"
	"reflect"
)

// GetBsonTags 获取bson tag
func GetStructBsonTags(i interface{}) []string {

	tags := []string{}
	t := reflect.TypeOf(i)

	for i := 0; i < t.NumField(); i++ {
		field := t.Field(i)

		// 获取bson标签的值
		bsonTag := field.Tag.Get("bson")
		if bsonTag != "" {
			tags = append(tags, bsonTag)
		}
	}
	return tags
}

func SetStructValueByBsonTag(i interface{}, tag string, value interface{}) error {
	if value == nil {
		return nil
	}
	v := reflect.ValueOf(i)
	if v.Kind() != reflect.Ptr {
		return fmt.Errorf("expected a pointer, but got %v", v.Kind())
	}
	v = v.Elem()
	t := v.Type()

	for i := 0; i < v.NumField(); i++ {
		field := t.Field(i)
		// 获取bson标签的值
		bsonTag := field.Tag.Get("bson")
		if bsonTag == tag {
			// 确保你可以导出这个字段
			if !v.Field(i).CanSet() {
				return fmt.Errorf("cannot set field %s", field.Name)
			}
			// 更新字段的值
			v.Field(i).Set(reflect.ValueOf(value))
			break
		}
	}

	return nil
}

func GetStructValueByBsonTag(i interface{}, str string) interface{} {
	v := reflect.ValueOf(i)
	if v.Kind() == reflect.Ptr {
		v = v.Elem()
	}

	t := reflect.TypeOf(i)
	if t.Kind() == reflect.Ptr {
		t = t.Elem()
	}

	for i := 0; i < t.NumField(); i++ {
		field := t.Field(i)

		// 获取bson标签的值
		bsonTag := field.Tag.Get("bson")
		if bsonTag == str {
			Printf("str:%s", str)
			Printf("str-v:%+v", v.Field(i).Interface())
			return v.Field(i).Interface()
		}
	}
	return nil
}
